import Vue from 'vue'
import VueRouter from "vue-router";


/* 引入仓库 */
import store from "@/store"
import routes from "@/router/routes";


Vue.use(VueRouter)



/* 编程时导航 对此执行时会报错  因为router时pormise形式 跳转后会返回成功与失败的回调 给push方法和replace方法成功和回调的函数就可以捕获到错误 */

/* 先把Vuerouter先保存一份 */
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace

/* 重写push与replace方法 */
/* 第一个参数：告诉原来的push方法往哪里跳转(传递哪些参数) */
/* 第二第三个参数:告诉他成功或者失败的回调 */
/* 其中的call方法 让它重新去指向路由组建自己的实例 谁去调用push|replace方法就指向谁 */
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve, reject) {
        /* call方法改变它指向为原来原有的实例 如果传递了错误信息就执行 传参 传成功或失败的信息 */
        originPush.call(this, location, resolve, reject)
    } else {
        /* 如果没有传递 那就手动写成功与失败的回调函数 */
        originPush.call(this, location, () => { }, () => { })
    }
}

/* replace相同 */
VueRouter.prototype.replace = function (location, resolve, reject) {
    if (resolve, reject) {
        /* call方法改变它指向为原来原有的实例 如果传递了错误信息就执行 传参 传成功或失败的信息 */
        originReplace.call(this, location, resolve, reject)
    } else {
        /* 如果没有传递 那就手动写成功与失败的回调函数 */
        originReplace.call(this, location, () => { }, () => { })
    }
}



/* 配置路由 */
let router = new VueRouter({
    /* 配置路由 */
    routes,
    /* 跳转时滚动行为 */
    scrollBehavior() {
        /* y轴归0 */
        return { y: 0 }
    },
})

/* 全局守卫：前置守卫  to可以获取你跳转到那里的跳转信息  from可以获取到你从哪里跳转的信息 next 放行 nexr:放行函数  next()直接放行  next(path)放行到指定路径  next(false)路径改变跳转上一个   */
router.beforeEach(async (to, from, next) => {
    /* 用户登陆了才会有token  用户没有登陆一定没有token */
    let token = store.state.user.token
    /* 用户的信息 */
    let name = store.state.user.userInfo.name
    if (token) {
        /* 用户已经登录 还想去logoin或register 就不行了就让它回到首页 */
        if (to.path == '/logoin' || to.path == '/register') {
            next('/home')
        } else {
            /* 登陆了 单去的不是logoin||register 需要判断仓库是否有token 如果没有再次派发actions使仓库userInfo一直存在 */
            if (name) {
                next()
            } else {
                /* 如果没有用户信息 派发actions如果成功了  让仓库存储用户信息再次跳转 */
                try {
                    await store.dispatch('getUserInfo')
                    next()
                } catch (error) {
                    /* 如果没捞到用户信息那就是token失效了 那就清除token回到登录页 */
                    await store.dispatch('userLogout')
                    next('/logoin')
                }
            }
        }

    } else {
        /* 用户未登录 不能去交易相关的页面和支付相关的页面和个人中心页面 trade pay paysuccess myorder 未登录去这些路由直接跳转登录页 不是这些页面放行  */
        let toPath = to.path
        if (toPath.indexOf('/trade') !== -1 || toPath.indexOf('/pay') !== -1 || toPath.indexOf('/center') !== -1) {
            /* 把未登录的时候想去但没去成的参数存储于路由当中  再去首页的时候进行判断是否有query参数 有的话跳转query参数地址 记得反编码decodeURIComponent('%2Fcenter%2Fmyorder') */
            next('/logoin?redirect=' + toPath)
        } else {
            next()
        }

    }
})

/* 路由独享守卫   只再路由页面去设置 */
/* 1 只有从购物车页才能跳转到交易页 */
/* 2 只有从交易页面才能跳转到支付页面 */
/* 3 只有从支付页面才能跳转支付成功页面 */



export default router